import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.pyplot import figure
import seaborn as sn
from azureml.core import Workspace, Dataset
import azureml
from sklearn.preprocessing import LabelEncoder
import os

# 导入数据
df = pd.read_csv('Dataset/weather_dataset_raw.csv')

# 打印导入数据的具体信息
#print("dataset head: {0}".format(df.head()))
#print("dataset describe: {0}".format(df.describe()))
#print("dataset shape: {0}".format(df.shape))
#print("dataset dtypes: {0}".format(df.dtypes))

# 我们看到，Weather_conditions这一列有的地方是没有填值的，我们将空白或者na的值改为上一行的值。
if df.isnull().values.any():
    df['Weather_conditions'].fillna(method='ffill',inplace=True,axis=0)

# `Timestamp`列为object 格式，需要更改为DateTime格式
df['Timestamp'] = pd.to_datetime(df['Timestamp'])

# 由于我们的目标是预测天气是否有雨，所以原来的标签：rain, snow, clear，可以变为rain, no_rain
print("Collect labels of Weather_conditions column with frequencies: {0}".format(df.Weather_conditions.value_counts()))
df["Weather_conditions"].replace({"snow": "no_rain", "clear": "no_rain"}, inplace=True)
# 然后我们对其编码，rain, no_rain分别对应0和1
le = LabelEncoder()
y = df['Weather_conditions']
y = le.fit_transform(y)
# 并且我们新加一列
y = pd.DataFrame(data=y, columns=["currentWeather"])
df = pd.concat([df, y], axis=1)
df.drop(['Weather_conditions'],axis=1,inplace=True)
# 因为我们的任务是预测未来4小时的天气状况（是否有雨），因此我们通过将`currentWeather`移动四行创建了一个名为`futureWeather`的新特征
df['futureWeather'] = df.currentWeather.shift(4, axis = 0) 
df.dropna(inplace=True) # 我们将带有na或者空的行删除，有雨最后一列是向上移动4行，所以会有四行是na或者空，我们需要把这四行移除
df['futureWeather'] = df['futureWeather'].apply(np.int64)

# `Temperature_C`和`Apparent_Temperature_C`的相关性高达0.99，那么我们就不用把`Apparent_Temperature_C`放进模型里面。
# 另外，`S_No`指的是index值，所以我们也不用将其放入模型。
df.drop(['S_No', 'Apparent_Temperature_C'],axis=1,inplace=True)

# 新建文件夹
if not os.path.exists('Dataset'):
    os.makedirs('Dataset')

# 保存处理好的数据
df.to_csv('Dataset/weather_dataset_processed.csv',index=False)

# 我们将处理完的数据分为训练数据集以及验证数据集
dfTrn = df.iloc[:int(8/10*df.shape[0])]
dfTest = df.drop(dfTrn.index)
print("Shape of input dataset: {0}; shape of training dataset: {1}; shape of validation dataset: {2}"\
      .format(df.shape, dfTrn.shape, dfTest.shape))

# 将两个数据集保存到本地
dfTrn.to_csv('Dataset/train_data.csv',index=False)
dfTest.to_csv('Dataset/test_data.csv',index=False)

